// 目标:希望将来写爬虫的时候，来一个类继承祖宗类
// 然后，在子类中处理得到的结果即可

// 爬虫用法，创建爬虫对象，传入URL自动开爬
const https = require('https')
const cheerio = require('cheerio')
import SpiderOptions from "./interfaces/SpiderOptions";

export default class Spider {
    // 定义成员
    options:SpiderOptions
    //使用接口定义options的成员
    constructor(options:SpiderOptions = { url:'',method:'get',headers:{}}){
        // 初始化
        this.options = options
        this.start()
    }
    start(){
        // 创建请求对象
        let req = https.request(this.options.url,{
            headers:this.options.headers,
            method:this.options.method 
        },(res:any) => {
            let chunks:any[] = []

            // 创建一个对象来存储键值对  
            const info:any = {};  

            res.on('data',(c:any) => chunks.push(c))

            res.on('end',()=>{
                let result = Buffer.concat(chunks).toString('utf-8')
                // console.log(result)
                let $ = cheerio.load(result)
                // console.log($('#content h1'))
                // 标题部分
                let textContent = '';
                $('#content h1 > span').each((index:number, element:any) => { 
                    textContent += $(element).text();
                    // console.log(`Span: ${index + 1} text: ${textContent}`);  
                }); 
                // console.log(textContent) 
                info['标题'] = textContent; 
                console.log(info);
                
                // 信息部分
                textContent ='';
                $('#info').each((index:number, element:any)=>{
                    textContent = $(element).text();
                    // console.log(textContent)  
                    // console.log(`Span: ${index + 1} text: ${textContent}`);  
                })
                // 将字符串按行分割成数组  
                const lines = textContent.trim().split('\n');  
                
                // // 创建一个对象来存储键值对  
                // const info:any = {};  
                
                // 遍历每一行数据  
                lines.forEach(line => {  
                // 使用冒号分割字符串成两部分  
                const [key, value] = line.split(':').map(str => str.trim());  
                // 将键值对添加到对象中
                if(key!=''&&key!=null&&value!=undefined){
                    info[key] = value; 
                }  
                });  
                
                // 输出处理后的对象  
                console.log(info);

                //介绍部分
                textContent ='';
                $('.related-info .indent span').each((index:number, element:any)=>{
                    textContent = $(element).text(); 
                    // console.log(`Span: ${index + 1} text: ${textContent}`);  
                })
                info['介绍'] = textContent.replace(/[\n\s]+/g, ''); 
                console.log(info);
                // JSON解析
                // console.log(JSON.parse(result).items)
                // let data = JSON.parse(result).items
                // interface Item {  
                //     id: string;  
                // }  
                // const ids = data.map((item:Item) => item.id );
                // console.log(ids);
            })  
        })

        // 发送请求
        req.end()
    }
}